---
title: 高性能IO模型
description: Redis的单线程设计机制以及多路复用机制
---
我们通常说，Redis 单线程，主要是指 **Redis 的网络 IO 和键值对读写是由一个线程完成的，这也是 Redis 对外提供键值存储服务的主要流程。**

但 Redis 的其它功能，比如持久化、异步删除、集群数据同步等，其实是由额外的线程执行的。

所以，严格来说， Redis 并不是单线程。

## Redis 为什么使用单线程
要更好地理解 Redis 为什么使用单线程，就要先了解多线程的开销。
### 多线程的开销
系统中通常存在被多线程同时访问的资源，比如一个共享的数据结构。当有多个线程要修改这个共享资源时，为了保证共享资源的正确性，就需要有额外的机制进行保证，而这个额外的机制，就会带来额外的开销。

多线程编程模式会面临的共享资源的并发访问控制问题。并发访问控制一直是多线程开发中的一个难点问题，如果没有精细的设计，比如说，只是简单地采用一个粗粒度互斥锁；即使增加了线程，大部分线程也在等待获取访问共享资源的互斥锁，并行变成串行，系统吞吐量并没有随着线程的增加而增加。

而且，采用多线程开发一般会引入同步原语来保护共享资源的并发访问，这也会降低系统代码的易调试性和可维护性。

并且，线程切换也会带来性能损耗。

为了避免这些问题，Redis 直接采用了单线程模式。
### 单线程 Redis 为什么那么快？
通常来说，单线程的处理能力要比多多线程差很多，但是 Redis 却能使用单线程模型达到每秒数十万计的处理能力。其实，这是 Redis 多方面设计选择的一个综合结构。

一方面，Redis 的大部分操作在内存中完成，再加上它采用了高效的数据结构，例如哈希表和跳表，这是它实现高性能的一个重要原因。另一方面，就是 Redis 采用了多路复用机制，使其在网络 IO 操作中能并发处理大量的客户端请求。实现高吞吐量。

### 基本 IO 模型与阻塞点

Redis 监听到一个客户端有连接请求，但一直未能成功建立起连接时，会阻塞。类似地，当 Redis 从一个客户都安读取数据时，如果数据一直没有到达，也会一直阻塞。

### 基于多路复用的高性能I/O模型
Linux 中的 IO 多路复用机制是指一个线程处理多个 IO 流，就是我们经常听到的 select/epoll 机制。简单来说，在 Redis 只运行单线程的情况下，该机制允许内核中，同时存在多个监听套接字和已连接套接字。内核会一直监听这些套接字上的连接请求或数据处理。一旦有请求到达，就会交给 Redis 线程处理，这就实现了一个 Redis
线程处理多个 IO 流的效果。
